/**
 * Check if an element has a class
 * @param {HTMLElement} ele
 * @param {string} cls
 * @returns {boolean}
 */
export function hasClass(ele, cls) {
  return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
}

/**
 * Add class to element
 * @param {HTMLElement} ele
 * @param {string} cls
 */
export function addClass(ele, cls) {
  if (!hasClass(ele, cls)) ele.className += " " + cls;
}

/**
 * Remove class from element
 * @param {HTMLElement} ele
 * @param {string} cls
 */
export function removeClass(ele, cls) {
  if (hasClass(ele, cls)) {
    const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
    ele.className = ele.className.replace(reg, " ");
  }
}

/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path);
  return isExternal;
}

export function isNotEmpty(obj){
  return (obj !== undefined && obj !== null && obj !== '' && obj !== 'null')
}

export const deepCopy = (obj) => {
  return JSON.parse(JSON.stringify(obj))
}

export const downloadFile = (resp) => {
  let arr = resp.headers["content-disposition"] ? resp.headers["content-disposition"].split('filename=') : []
  const fileName = decodeURIComponent(arr[1])
  const blob = new Blob([resp.data], {
    type: "application/octet-stream;charset=UTF-8"
    // type: "application/vnd.ms-excel"
  });
  if (typeof window.navigator.msSaveBlob !== "undefined") {
    window.navigator.msSaveBlob(blob, fileName)
  } else {
    const blobURL = window.URL.createObjectURL(blob)
    const tempLink = document.createElement("a")
    tempLink.style.display = "none"
    //开发人员自己定义的一些文件流
    tempLink.href = blobURL;
    tempLink.setAttribute("download", fileName)
    if (typeof tempLink.download === "undefined") {
      tempLink.setAttribute("target", "_blank")
    }
    document.body.appendChild(tempLink)
    tempLink.click()
    document.body.removeChild(tempLink)
    window.URL.revokeObjectURL(blobURL)
  }

}

/**
 * 将文件大小从一个单位转换为另一个单位。
 * @param size 文件大小。
 * @param fromUnit 初始单位（'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'）。
 * @param toUnit 目标单位（'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'）。
 * @param containsUnit 结果包含转换后的单位，默认包含。
 * @param decimalPoint 结果保留的小数位数，默认为2。
 * @returns {*} 转换后的文件大小，带单位。
 */
export const convertFileSize = (size, fromUnit, toUnit, containsUnit = true, decimalPoint = 2) => {
  // 定义单位与字节之间的转换关系
  const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
  // 获取初始单位和目标单位的索引
  const fromIndex = units.indexOf(fromUnit)
  const toIndex = units.indexOf(toUnit)

  // 如果单位不在列表中，抛出错误
  if (fromIndex === -1 || toIndex === -1) {
    throw new Error('Invalid units')
  }

  // 计算初始单位与目标单位之间的转换系数
  const exponent = toIndex - fromIndex
  // 计算结果大小
  const resultSize = size / Math.pow(1024, exponent)

  // 返回格式化后的结果
  return parseFloat(resultSize.toFixed(decimalPoint)) + (containsUnit ? ' ' + toUnit : '')
}

/**
 * base64转Blob文件
 * @param base64
 * @param type 默认下载的是excel格式的文件
 * @returns {Blob}
 */
export const base64ToBlob = (base64, type = "application/vnd.ms-excel") => {
  let bstr = atob(base64),
      n = bstr.length,
      u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type });
}

/**
 * 文件转base64
 * @param file
 */
export const blobToBase64 = (file) => {
  const reader = new FileReader()
  reader.readAsDataURL(file)
  return new Promise((resolve, reject) => {
    reader.onload = (e) => resolve(e.target.result)
  })
}
